package rn;

import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import excessoes.RNException;
import fabricas.DAOFabrica;
import interfaces.InterfaceUsuarioDAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import util.EncriptaSenha;
import util.FacesUtil;
import entidades.LogEventos;
/**
 *
 * @author Marcelo Gomes Neto
 */

public class UsuarioRN
{
    private InterfaceUsuarioDAO interfaceUsuarioDAO;

    public UsuarioRN() {
        this.interfaceUsuarioDAO = DAOFabrica.criarUsuarioDAO();
    }
    
    public Usuario carregar(Integer id) throws DAOException {
        return this.interfaceUsuarioDAO.carregarUsuario(id);
    }
    
    public Usuario carregarUsuarioPorSaram(Integer saram) throws DAOException {
        return this.interfaceUsuarioDAO.carregarUsuarioPorSaram(saram);
    }
    
    public String salvar(Usuario usuario) throws DAOException, Exception
    {
        Date dataAtual = new Date(System.currentTimeMillis()); // No cadastramento de uma novo usuário, é inserida a data do dia do cadastramento no campo data_cadastramento. 
        Integer id = null;
        String tel = null;
        // Replace necessário para retirar a máscara do inputMask
        tel = usuario.getPessoa().getTelComercial().replace("(", "").replace(")", "").replace("-", "");
         if (usuario.getIdusuario() != null){
             id = usuario.getIdusuario();
        }
        //String email = usuario.getPessoa().getEmailComercial();
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNome();
        String login = usuario.getLogin();
        Integer saram = usuario.getSaram();
        
        //Obtem a descrição da OM
        Integer idunidade = usuario.getPessoa().getUnidade();
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar um = unidadeMilitarRN.carregarUnidadeMilitar(idunidade);
        String descricaoUnidade = um.getSiglaOM();

        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setDataEvento(dataAtual);

        //Verifica se já existe o saram
        Usuario contemSaram = this.carregarUsuarioPorSaram(saram);
        
        //Verifica se já existe o login
        Usuario contemLogin = this.buscarPorLogin(login);
        /*
        List<Usuario> usuariosL = this.listarUsuarios();
        List<String> novosLogins = new ArrayList<>();
        for (int i = 0; i < usuariosL.size(); i++) {
            String oldLogin = usuariosL.remove(i).getLogin();
            novosLogins.add(oldLogin);
        }
        */
     
        usuario.getPessoa().setTelComercial(tel);
        
       
        if (id == null || id == 0) 
        {

        
            if (usuario.getPessoa().getUnidade() == null || usuario.getPessoa().getUnidade() == -1) {
                String msg = "É necessário selecionar uma Unidade! Operação não realizada.";
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
                return null;
            }
        
            if (usuario.getPessoa().getSetor() == null || usuario.getPessoa().getSetor() == -1) {
                String msg = "É necessário selecionar um Setor! Operação não realizada.";
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
                return null;
            }
        
            if (contemLogin != null) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Login já existe!", ""));
                return null;
            }

            if (contemSaram != null) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Saram já existe!", ""));
                return null;
            }

            usuario.setDataCadastramento(dataAtual);
            usuario.setAtivo(false);
            usuario.setPermissao("ROLE_CONVENCIONAL");
            usuario.getPessoa().setUsuario(usuario);
            this.interfaceUsuarioDAO.salvarUsuario(usuario);
                
            Integer ultimoID = this.retornaUltimoID();
            logEventos.setIdusuario(ultimoID);
            logEventos.setDescricao("o usuário "+nomeUsuario+" ("+descricaoUnidade+") cadastrou-se no sistema.");
            logEventosRN.salvarEvento(logEventos);
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado com sucesso!", ""));
        }
        else
        {
            if (usuario.getPessoa().getUnidade() == null || usuario.getPessoa().getUnidade() == -1) {
                String msg = "É necessário selecionar uma Unidade! Operação não realizada.";
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
                return null;
            }
        
            else if (usuario.getPessoa().getSetor() == null || usuario.getPessoa().getSetor() == -1) {
                String msg = "É necessário selecionar um Setor! Operação não realizada.";
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
                return null;
            }
            
            else {
                this.interfaceUsuarioDAO.atualizarUsuario(usuario);
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro atualizado com sucesso!", ""));
            }
        }
        return null;
    }
    
    public List<Usuario> buscarPorListaLogin(String login) {
        return this.interfaceUsuarioDAO.buscarPorListaLogin(login);
    }
    
    public Usuario buscarPorEmailComercial(String email) {
        return this.interfaceUsuarioDAO.buscarPorEmailComercial(email);
    }

    public List<Usuario> buscarPorListaSaram(Integer saram) {
        return this.interfaceUsuarioDAO.buscarPorListaSaram(saram);
    }
        
    public void atualizar(Usuario usuario) throws DAOException 
    {
        String senha = usuario.getSenha();
        usuario.setSenha(EncriptaSenha.encriptar(senha)); //Instrução para gravar a senha no formato md5
        this.interfaceUsuarioDAO.atualizarUsuario(usuario);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro alterado com sucesso!", ""));
    }
    
    public void excluir(Usuario usuario, Usuario usuarioLogado) throws RNException, DAOException, Exception
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        //Obtem a descrição da OM
        Integer idusuLogado = usuarioLogado.getPessoa().getUnidade();
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar um = unidadeMilitarRN.carregarUnidadeMilitar(idusuLogado);
        String descricaoUnidade = um.getSiglaOM();
        
        String nomeUsuarioLogado = usuarioLogado.getPessoa().getPostoGraduacao()+" "+usuarioLogado.getPessoa().getNome();
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNome();
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusuLogado);
        logEventos.setDataEvento(dataAtual);
        
        String loginUsuario = usuario.getLogin();
        if (loginUsuario.equalsIgnoreCase("supervisor")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "O usuário supervisor não pode ser excluído!", ""));
        }
        else 
        {
            this.interfaceUsuarioDAO.excluirUsuario(usuario);
            
            logEventos.setDescricao("o usuário "+nomeUsuarioLogado+" ("+descricaoUnidade+") excluiu o cadastro do usuário "+nomeUsuario+".");
            logEventosRN.salvarEvento(logEventos);
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuário excluído com sucesso!", ""));
        }
    }
    
    public void atualizarUsuario(Usuario usuario) throws DAOException {
        this.interfaceUsuarioDAO.atualizarUsuario(usuario);
    }
    
    public void atualizarSenhaRecuperacao(Usuario usuario) throws DAOException, Exception 
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer id = usuario.getIdusuario();
        //String nomeUsuario = usuario.getPessoa().getNome();
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNome();
        
        //Obtem a descrição da OM
        Integer idunidade = usuario.getPessoa().getUnidade();
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar um = unidadeMilitarRN.carregarUnidadeMilitar(idunidade);
        String descricaoUnidade = um.getSiglaOM();

        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(id);
        logEventos.setDataEvento(dataAtual);
        logEventos.setDescricao("o usuário "+nomeUsuario+" ("+descricaoUnidade+") recuperou sua senha.");
        
        String senha = usuario.getSenha();
        usuario.setSenha(EncriptaSenha.encriptar(senha)); //Instrução para gravar a senha no formato md5
        this.interfaceUsuarioDAO.atualizarUsuario(usuario);

        logEventosRN.salvarEvento(logEventos);
    }
    
    public List<String> listarEmailAdministradores() {
        return this.interfaceUsuarioDAO.listarEmailAdministradores();
    }
    
    public Usuario buscarPorLogin(String login) {
        return this.interfaceUsuarioDAO.buscarPorLogin(login);
    }
    
    public Usuario buscarPorSaram(Integer saram) {
        return this.interfaceUsuarioDAO.buscarPorSaram(saram);
    }
    
    public List<Usuario> listarUsuarios() {
        return this.interfaceUsuarioDAO.listarUsuario();
    }
    
    public Object totalUsuarios() {
        return this.interfaceUsuarioDAO.totalUsuarios();
    }
    
    public Object totalUsuariosAtivos() {
        return this.interfaceUsuarioDAO.totalUsuariosAtivos();
    }
    
    public Object totalUsuariosInativos() {
        return this.interfaceUsuarioDAO.totalUsuariosInativos();
    }
    
    public Integer retornaUltimoID() {
        return this.interfaceUsuarioDAO.retornaUltimoID();
    }
}

/*
 * for (Iterator<Integer> it = dadosAFiltrar.iterator(); it.hasNext(); ) {  
            Integer n = it.next();  
            if (dadosARemover.contains (n)) {  
                it.remove ();  
            }  
        }  
 */